package cn.dai.Lambda;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.function.Consumer;

/**
 * @author ArkD42
 * @file 1 - Java基础语法
 * @create 2020 - 04 - 23 - 12:25
 */
public class LambdaTest {
    @Test
    public void t1(){
        Runnable runnable1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("我爱北京天安门！！！");
            }
        };

        // ---------------------------------------------------

        // lambda表达式
        Runnable runnable2 = () -> System.out.println("我爱巴黎凯旋门！！！");
    }

    @Test
    public void t2(){
        Comparator<Integer> comparator1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        };

        // lambda 1
        Comparator<Integer> comparator2 = (o1, o2) -> Integer.compare(o1,o2);

        // lambda 2 方法引用
        Comparator<Integer> comparator3 = Integer::compare;

    }

    // (o1, o2) -> Integer.compare(o1,o2);
    // 格式
    //  Lambda 操作符 : 操作符 或者 -> 操作符 参数列表()
    //
    //  右边 Lambda体 就是重写抽象方法的方法体
    //


    @Test
    public void lambda(){
        // Lambda本质是一个接口的实例

        // 第一种：无参数无返回值，且只有一个语句时，方法体{}不需要书写
        Runnable runnable = () -> System.out.println("Hello Lambda!!!");

        // 第二种：一个参数，无返回值
        Consumer<String> con1 = (String s) -> {
            System.out.println(s + " 是这个方法的参数！！！");
        };
        con1.accept("啊啊啊啊");

        // 第三种：类型推断，不需要书写具体类型要求，编译器自动推断
        Consumer<String> con2 = (s) -> System.out.println(s + " 是这个方法的参数！！！");
        con2.accept("呵呵呵");

        // 例如泛型的类型推断
        List<String> list = new ArrayList<>(); // 右边可不写泛型的具体类型
        // 例如数组的静态初始化
        int[] array = {1,2,3,4,5}; // 元素符合类型即可

        // 第四种：只有一个参数，可不写括号
        Consumer<String> con3 = s -> System.out.println(s + " 是这个方法的参数！！！");
        con3.accept("无括号单参数注入");

        // 第五种：两个以上参数 ,多条语句,可以返回值
        Comparator<Integer> com1 = (o1,o2) -> {
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };

        int compare = com1.compare(100, 50);
        System.out.println(compare);

        // 第六种：只有一条语句时，return和大括号都可以不要了
        Comparator<Integer> com2 = (o1,o2) -> o1.compareTo(o2);
    }

}
